<?php
/**
 * 栏目/分类管理
 * 
 * ============================================================================
 * 版权所有: (c) 2009-2011，<UEShop Inc>，并保留所有权利。
 * 网站地址: http://www.ueshop.cn
 * ----------------------------------------------------------------------------
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用；
 * 不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 *
 * @author      cmpan
 * @copyright   Copyright (c) 2009-2010 UEShop Inc. (http://www.ueshop.cn)
 * @license     http://www.ueshop.cn/1_0.txt
 */
class CatModel extends UE_Model {
    public $table  = 'ue_cat';
	public $key    = 'cat_id';
	
	/**
	 * 添加分类
	 *
	 * @param array $cat
	 * @return int
	 */
	public function add($cat) {
		if (empty($cat['cat_name'])) {
			$this->setErr('标题名称不能为空');
			return false;
		}
		
		if (empty($cat['cat_app'])) {
			$this->setErr('请选择分类所属应用');
			return false;
		}
		
		// 实体化“"”，“'”，“<”，“>”
		$cat = array_map('htmlspecialchars', $cat);
		
		if (!empty($cat['cat_slug'])) {
			$cat['cat_slug'] = urlencode($cat['cat_slug']);
		} else {
			$cat['cat_slug'] = urlencode($cat['cat_name']);
		}
		
	    $id = parent::add($cat);
	    
	    // 更新栏目URL
	    if ($id) {
	    	$catUrl = UE_Url::make($cat['cat_app'].'/show/list/'.$id);
	    	$this->_db()->query("UPDATE {$this->table} SET cat_url='$catUrl' WHERE cat_id=$id LIMIT 1");
	    }
	    
	    // 设置栏目默认排序
	    if ($id && empty($cat['cat_order'])) {
	    	$this->_db()->query("UPDATE {$this->table} SET cat_order='$id' WHERE cat_id=$id LIMIT 1");
	    }
	    
	    UE_Cache::createCache()->clear('cats');
	    return $id;
	}
	
	/**
	 * 更新分类
	 *
	 * @param array $cat
	 * @return bool
	 */
	public function update($cat) {
		if (empty($cat['cat_name'])) {
			$this->setErr('标题名称不能为空');
			return false;
		}
		
		unset($cat['cat_app']);
		
		// 实体化“"”，“'”，“<”，“>”
		$cat = array_map('htmlspecialchars', $cat);
		
		if (!empty($cat['cat_slug'])) {
			$cat['cat_slug'] = urlencode($cat['cat_slug']);
		} else {
			$cat['cat_slug'] = urlencode($cat['cat_name']);
		}	    
		
		$r = parent::update($cat);
		
		UE_Cache::createCache()->clear('cats');
		
		return $r;
	}
	
	/**
	 * 获取可以使用分类的已启用应用
	 *
	 * @return array
	 */
	public function getUseCatApps() {
		$sql = "SELECT * FROM ue_app WHERE app_use_cat=1 AND app_activated=1";
		return UE_DB::factory()->getAll($sql);
	}
	
	/**
	 * 获取栏目信息
	 *
	 * @param string $catApp      分类所属应用
	 * @param string $parentId    上级分类id
	 * @param string $getDisable  是否获取被禁用的分类
	 * @return array
	 */
	public static function getCats($catApp = '', $parentId = 0, $getDisable = true) {		
		$cache = UE_Cache::createCache();
		$ctag = "cats/{$catApp}_{$parentId}_".(int)$getDisable;
		if ($cats = $cache->get($ctag, false)) {
			return $cats;			
		} else {
			$scope = '';
			
			if (!$getDisable) {
				$scope .= " AND cat_enabled=1";
			}
			if ($catApp) {
				$scope .= " AND cat_app='{$catApp}'";
			}
			
			$sql = "SELECT * FROM ue_cat WHERE true $scope ORDER BY cat_order, cat_id";
			$rs = UE_DB::factory()->getAll($sql);
			// 获取所有栏目信息并写入缓存
			$tree = new UE_Tree();
			$tree->set($rs, 'cat_id', 'cat_parent_id');
			$cats = $tree->get($parentId);
			$cache->set($ctag, $cats, 36000000);
			return $cats;
		}
	}
	
	/**
	 * 更新字段
	 *
	 * @param int $id
	 * @param array $data
	 * @return bool
	 */
	public function renew($id, $data) {
		if (!$this->check()) {
			return false;
		}
		
		if($this->_db()->update($this->table, $this->id, $id, $data)) {
			return true;
		} else {
			$this->setErr($this->_db()->getLastErr());
			return false;
		}
	}
	
		
	/**
	 * TODO 添加支持静态化的URL
	 *
	 * @return bool
	 */
	public function renewUrl() {
		$cats = $this->getCats();
		if ($cats) {
			foreach ($cats as $cat) {
				$catUrl = UE_Url::make($cat['cat_app'].'/show/list/'.$cat['cat_id']);
				
				$this->_db()->query("UPDATE {$this->table} SET cat_url='$catUrl' WHERE cat_id={$cat['cat_id']} LIMIT 1");
				
				if ($this->_db()->hasErr()) {
					$this->setErr($this->_db()->getErrs());
					return false;
				}
			}
		}
		
		// 删除栏目缓存
		UE_Cache::createCache()->clear('cats');
		return true;
	}
	

	/**
	 * 删除实体
	 *
	 * @return bool
	 */
	public function delete() {
		if(! $this->check()) {
			return false;
		}
		
		$cats =CatModel::getCats();
		$cat = $cats[$this->id];
		
		if (!empty($cat['cat_allow_del'])) {
			$this->setErr('不允许删除该分类。');			
			return false;
		}
		
		if($cat['hasChile']) {
			$this->setErr('该分类下还有子分类，不能删除。您必须先删除该分类下的子分类才能删除该分类。');			
			return false;
		}
		
		if ($cat['cat_post_count']) {
			$this->setErr('该分类下还有内容，不能删除。您必须先删除该分类下的内容才能删除该分类。');			
			return false;
		}
		
	    // 不可删除有内容的分类
		$cat = $this->_cat->read();
		if ($cat['cat_post_count']) {
			$this->setErr('该分类下还有内容，不能删除');			
			return false;
		}
		
		//
		$rs = parent::delete();
		
		if ($rs === false) {
			$this->setErr(UE_DB::factory()->getLastErr());
		}
		
		UE_Cache::createCache()->clear('cats');
		return $rs;
	}
}